【Spring】实例化、初始化、InitializingBean等执行顺序(一) 您所在的位置:网站首页 spring boot 初始化执行 【Spring】实例化、初始化、InitializingBean等执行顺序(一)

【Spring】实例化、初始化、InitializingBean等执行顺序(一)

2024-07-09 07:12| 来源: 网络整理| 查看: 265

今天先来测试一下Spring 初始化IOC流程中, 构造函数、@PostConstruct、InitializingBean接口,InstantiationAwareBeanPostProcessor接口,initMethod 等执行顺序。

pom org.springframework spring-context 5.3.12 junit junit 4.13.2 test Maple package com.gane.spring.config; import org.springframework.beans.factory.InitializingBean; /** * @author maple * @date 2021/10/29 */ public class Maple implements InitializingBean { private String name; private int age; public Maple(String name, int age) { System.out.println("实例化:Maple的有参构造器"); this.name = name; this.age = age; } private void initMethod(){ System.out.println("Maple的init-method..."); } private void destroy(){ System.out.println("Maple的destroy..."); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public void afterPropertiesSet() throws Exception { System.out.println("Maple实现了InitializingBean接口"); } } MySpring package com.gane.spring.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * @author maple * @date 2021/10/29 */ @Component public class MySpring implements InitializingBean { public MySpring() { System.out.println("实例化:MySpring 的构造函数"); } @PostConstruct public void postConstruct() { System.out.println("MySpring.PostConstruct"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("MySpring 实现了InitializingBean接口"); } } MyConfiguration package com.gane.spring.config; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * @author maple * @date 2021/11/8 */ @ComponentScan("com.gane.spring.config") @Configuration public class MyConfiguration implements InstantiationAwareBeanPostProcessor { @Bean(initMethod = "initMethod", destroyMethod = "destroy") public Maple maple() { return new Maple("maple", 18); } @Override public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException { System.out.println("实例化 " + beanName + " 之前:postProcessBeforeInstantiation"); return null; } @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { System.out.println("实例化 " + beanName + " 之后:postProcessAfterInstantiation"); return true; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化 " + beanName + " 之前:postProcessBeforeInitialization"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化 " + beanName + " 之后:postProcessAfterInitialization"); return bean; } } ApplicationTest import com.gane.spring.config.MyConfiguration; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @author maple * @date 2021/10/29 */ public class ApplicationTest { @Test public void test(){ ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfiguration.class); System.out.println("IOC容器初始化成功"); } } 测试结果

 可以看到: 

1、先做实例化,再做初始化。

2、实例化之前 ——> 实例化(构造函数) ——> 实例化之后

3、初始化之前  ——> PostConstruct  ——> 实现了InitializingBean接口  ——> init-method   ——> 初始化之后

我们再来看下 postProcessBeforeInstantiation 这个方法,他是默认返回 null 的 

如果我们让他返回一个不为null的值,看看会发生什么事情。

启动测试:

 可以看到 MySpring 只打印了:实例化 mySpring 之前、初始化 mySpring 之后。

实例化:MySpring 的构造函数 实例化 mySpring 之后:postProcessAfterInstantiation 初始化 mySpring 之前:postProcessBeforeInitialization MySpring.PostConstruct MySpring 实现了InitializingBean接口

这些都不见了,我们猜测是因为执行到 postProcessBeforeInstantiation 的时候返回了不为空的Bean,Spring认为我们自己给定了一个Bean,就不再帮我们做实例化和初始化工作了,就当做是该Bean已经完成整个初始化工作了。该Bean的顺序变为:

1、实例化之前 ——> 初始化之后

以上两种情况的执行顺序我们知道了,下面我们从源码里去找证据。

【Spring】实例化、初始化、InitializingBean等执行顺序(二)icon-default.png?t=LA46https://hongchenkezhan.blog.csdn.net/article/details/121227311



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有